<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body onload="fn();">
    <h1 id="time" > </h1>
    <script>
        // 1.JS延迟加载的方式有哪些？（5）
            // （1）放在页面的底部
            // （2）使用defer属性延迟加载

        // 2.前端 JavaScript 中的 ECMAScript、DOM、BOM 的含义；（5）
            // ECMAScript：定义了JavaScript的语法规范 JavaScript的核心，描述了语言的基本语法和数据类型；
            // DOM：文档对象模型；
            // BOM：浏览器对象模型；

        // 3.JavaScript 的数据类型有哪些？（5）
            // （1）简单数据类型：Number String  Boolean Null Undefined Symbol
            // （2）引入数据类型：Object  Array   Function
            
        // 4.如何进行数据类型的判断？（5）
            // （1）typeof xxx方法
            // （2）xxx instance  xxx方法
            // （3）Object.prototype.toString.call()方法

        // 5.null 和 undefined 的区别？什么时候会得到 undefined？（5）
            //null：空值，空的对象，空的指针
            // undefined：声明变量但是没有赋值，表无意义（空值）
            // 用typeof检测它们分别返回:undefined、object

            // 什么时候会得到 undefined？
                // 声明变量没有赋值
                // 预解析时声明变量未定义
                // 对象没有的属性名
                // 函数定义未传参或者没有return
                // 数组的forEach方法，没有返回值，返回的是undefined

        // 6.如何理解 null == undefined 返回 true，null === undefined 返回 false？（5）
            // ==  只需值一样，不需要类型一致， null 和undefined都是无效的值，用==是相等的 
            // ===  需要类型一致，否则为false

        // 7.使用 continue 或 break 终止循环时，两种方式的区别是？（5）
            // continue  跳出当前符合条件的流程，继续下一个流程
            // break  断所有的控制流程 

        // 8.如何判断字符串内是否包含指定字符？（5）
            // （1）使用indexOf(),为-1是不包含
            // (2)使用includes()方法，包含则返回true

        // 9.请尽量列举出数组的方法，并且注明哪些方法会修改原数组，哪些不会；（5）
            // 不会修改原数组：includes()、indexOf()、join()、concat()、reduce()、slice()、、lastIndexOf()、forEach()、slice()
            // 会修改原数组：reserse()、pop()、push()、shift()、unshift()、 splice()
        
        // 10. 请写出下面语句的输出结果：（5）
            var bar = true,
                number = 0;
            console.log(bar + 0);//1
            console.log(bar + "xyz");//truexyz
            console.log(bar + true);//2
            console.log(+true);//1
            console.log(!'bluej');//false
            console.log(number++);//0
            console.log(++number);//2
            console.log(number);//2

        // 11. 根据用户输入时间实现倒计时，输入格式错误时要有所提示（5）
            // window.prompt("请输入目标时间");
            let time = new Date(window.prompt("请输入目标时间"));
            function fn(time){
                let nDate = new Date();
                let Time = parseInt((time.getTime()-nDate.getTime())/1000);
                if(Time){
                    let h = parseInt(Time / (60 * 60) % 24);
                    let m = parseInt(Time / (60) % 60);
                    let s = Time % 60;
                    Time1 = "倒计时:"  + h + "时" + m + "分" + s + "秒";
                }else{
                    Time1 = "倒计时结束"
                    clearInterval(timer);
                };
                document.getElementById("time").innerHTML=Time1;
            };

            let timer = setInterval(function (){
                fn(time);
            },1000);

        // 13.把下面数组成员排序打乱；（5）
            var arr = [10, 20, 30, 40, 50, 60];
            let newArr = [];
            function fn1() {
                while (true) {
                    let a = Math.ceil(Math.random() * arr.length) - 1;
                    if (newArr.length == arr.length) {
                        break;
                    }
                    !newArr.includes(arr[a]) && newArr.push(arr[a]);
                }
                console.log(newArr);
            };
            fn1(arr);

        // 12.输出从小到大排序好的五个不重复的随机"素数",范围[10-58)；（10）
        let arr = [];
        for(let i =1;i<=5;i++){
            let t = parseInt(Math.floor(Math.random()*48 +10)),
            flag = true;
            for(let j=2;j<t;j++){
                if(t%j == 0){
                    flag =false;
                    break;
                };
            };
            (flag&&arr.indexOf(t) == -1)?(arr.push(t)):(i--);
        };
        arr.sort((a,b)=>a-b);
        console.log(arr);

        // 14. 将多个数组进行去重合并；（10）
            var arr1 = [1, 2, 3],
                arr2 = [2, 3, 4, 5];

            let arr3 = arr1.concat(arr2),arr4 = [];

            // 方法一：forEach
            // arr3.forEach(function(val){
            //     (arr4.includes(val) == false)&&arr4.push(val);
            // });

            // 方法二  filter
            arr4 = arr3.filter((item,index,arr3) => {
                return arr3.indexOf(item) == index;
            })

            console.log(arr4);


        // 15. 找出数组 arr=[1, 2, 3, "melon", 4, "melon", 2, 4, "melon"] 中重复出现过的元素,并用数组将重复元素装起来输出,并且统计每个元素出现的次数（10）
        var arr=[1, 2, 3, "melon", 4, "melon", 2, 4, "melon"] ;
        var arr1=[],arr2={};
        arr.forEach((val,index) =>{
            if(arr.indexOf(val,index+1) !=-1){
                if(arr2[val]){
                    arr2[val]++;
                }else{
                    arr2[val] = 1;
                }
                (!arr1.includes(val))&&arr1.push(val);
            };
        });
        console.log("重复的元素："+arr1)
        for(let key in arr2){
            console.log(key+"出现的次数"+arr2[key])
        };



        // 16. 找出数组中年龄小于18岁的女生的信息重新组成新的数组,并且将她们count变为现有的平方（10）
        var arr = [{
                name: "111",
                sex: "boy",
                age: 18,
                count: 20
            },
            {
                name: "222",
                sex: "girl",
                age: 17,
                count: 30
            },
            {
                name: "333",
                sex: "boy",
                age: 16,
                count: 40
            },
            {
                name: "444",
                sex: "girl",
                age: 15,
                count: 50
            },
            {
                name: "555",
                sex: "boy",
                age: 20,
                count: 60
            },
            {
                name: "666",
                sex: "girl",
                age: 13,
                count: 70
            },
            {
                name: "777",
                sex: "boy",
                age: 14,
                count: 80
            }
        ]

        var arr1 = [];
        arr.forEach(function(val){
            (val["age"]<18&&val["sex"]=="girl")&&(arr1.push(val)&&(val["count"] *= val["count"]));
        })
        console.log(arr1)
    </script>
</body>

</html>